﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Data;
using System.Data.SqlClient;
using System.Configuration;

namespace PingYou.Ado.Net
{
    /// <summary>
    /// 通用数据访问类
    /// </summary>
    public class SQLHelper
    {
        //获取配置文件
        static string connString = ConfigurationManager.ConnectionStrings["connString"].ToString();

        //适用于insert update delete
        public static int ExacuteNoQuery(string sql, SqlParameter[] param = null)
        {
            int result = -1;
            //【1】新建数据库连接
            SqlConnection conn = new SqlConnection(connString);
            //【2】将sql写入命令
            SqlCommand cmd = new SqlCommand(sql, conn);

            //【2.x】新增参数判断
            if (param != null)
            {
                cmd.Parameters.AddRange(param);
            }
            try
            {
                //【3】打开数据库连接
                conn.Open();
                //【4】执行sql
                result = cmd.ExecuteNonQuery();
            }
            catch (Exception myEx)
            {
                throw myEx;
            }
            finally
            {
                //【5】关闭连接
                conn.Close();
            }
            return result;
        }

        #region public static string ExecuteScalar(string sql) SELECT 查询第一行第一列的值进行返回，INSERT 返回插入数据的主键ID(自增长)
        /// <summary>
        /// SELECT 查询第一行第一列的值进行返回，INSERT 返回插入数据的主键ID(自增长)
        /// </summary>
        /// <param name="sql"></param>
        /// <returns></returns>
        public static string ExecuteScalar(string sql)
        {
            string result = string.Empty;
            //【1】新建数据库连接
            SqlConnection conn = new SqlConnection(connString);
            //【2】将sql写入命令
            if (sql.ToLower().IndexOf("insert") >= 0)
            {
                sql += " SELECT @@Identity";
            }

            SqlCommand cmd = new SqlCommand(sql, conn);

            try
            {
                //【3】打开数据库连接
                conn.Open();
                //【4】执行sql
                object obj = cmd.ExecuteScalar();
                if (obj != null)
                {
                    result = obj.ToString();
                }
            }
            catch (Exception myEx)
            {
                throw myEx;
            }
            finally
            {
                //【5】关闭连接
                conn.Close();
            }
            return result;
        }
        #endregion

        #region 执行结果集合的返回  通过ExecuteReader 游标一行一行读取信息
        public static SqlDataReader ExecuteReader(string sql)
        {
            //【1】新建数据库连接
            SqlConnection conn = new SqlConnection(connString);
            //【2】将sql写入命令
            SqlCommand cmd = new SqlCommand(sql, conn);
            try
            {
                //【3】打开数据库 
                conn.Open();
                //我们添加枚举CommandBehavior.CloseConnection之后，将来reader对象的链接会跟随对象的关闭自动关闭；
                return cmd.ExecuteReader(CommandBehavior.CloseConnection);
            }
            catch (Exception myEx)
            {
                throw myEx;
            }
        }
        #endregion


        #region
        //        public static DataSet ExecuteScalar(string sql)
        //        {

        //            string result = string.Empty;
        //            //① 创建一个 Connection 对象。
        //            SqlConnection conn = new SqlConnection(connString);
        //            //② 创建一个 DataAdapter对象。 
        //            SqlDataAdapter da = new SqlDataAdapter(sql, conn);
        //            //SqlCommand cmd = new SqlCommand(sql, conn);

        //            //③ 初始化适配器。
        //            SqlCommandBuilder build = new SqlCommandBuilder(da);
        //            //④ 使用数据适配器的 Fill 方法执行 SELECT 命令，并填充 DataSet。

        //            DataSet myDs = new DataSet();
        //            //da.Fill(myDs,,)


        //            try
        //            {



        ////⑤ 使用 DataTable对象提供的 NewRow 方法创建新行。
        ////⑥ 将数据行的字段设置为插入的值。
        ////⑦ 使用 DataRowAdd 类的 Add 方法将数据行添加到数据表中。
        ////⑧ 把 DataAdapter 类 的 InsertCommand 属 性 设 置成 需 要插 入记 录的
        ////INSERT 语句。
        ////⑨ 使用数据适配器提供的 Update方法将新记录插入数据库。
        ////⑩ 使用 DataSet类提供的 AcceptChanges方法将数据库与内存中的数据保
        ////持一致。
        //            }
        //            catch (Exception myEx)
        //            {

        //            }
        //            finally
        //            {
        //                //【5】关闭连接
        //                conn.Close();
        //            }
        //            return result;
        //        }
        #endregion
    }
}
